Again, here is the real code, fully commented
Code:
fseek(handle, 0, SEEK_END); // Goes to the end possition in the file.
int filesize = ftell(handle); // gets the length of the file.
rewind (handle); // Goes back to the start of the file
char* file_buffer = new char[filesize]; // a new dynamic memory variable
fread (file_buffer, filesize, 1, handle); // Reads a small file into the new variable
file_buffer = strchr(file_buffer, '\n') + 1; // Goes the the closest new line, then goes one point forward in the pointer to go past it so I can...
file_buffer = strchr(file_buffer, '\n') + 1; // Go down another line, then I pass it
delete[] file_buffer; // Now I delete the buffer. This isn't suppose to be here in the real code, but weather its at the bottom or here, this is the line that cuases the segment fault
This entire program is a big couple classes with variables and int functions, and the only thing the main function does is error handle the returns. It's basically a 300 line parser for a small file, but I wanted to make it more or less idiot proof ;P. There is another function right above this one that does similar stuff, no problems.. Here are both the whole functions (the set_dest one may not be completely accurate because I've been trying to fix it x_X)
Code:
int config::set_exempt (const char* delimiter) {
// Load the file and cut it down to the exempt line only
fseek(handle, 0, SEEK_END);
int filesize = ftell(handle);
rewind (handle);
char* file_buffer = new char[filesize];
fread (file_buffer, filesize, 1, handle);
file_buffer = strchr(file_buffer, '\n') + 1;
if (strchr(file_buffer, '\n') == NULL) {
delete[] file_buffer;
return -1;
}
if (strlen(file_buffer) == strlen(strchr(file_buffer, '\n'))) {
delete[] file_buffer;
return -2;
}
char* tracker = new char[strlen(file_buffer) - strlen(strchr(file_buffer, '\n')) + 1];
if (strlen(file_buffer) - strlen(strchr(file_buffer, '\n')) != strlen(delimiter)) {
strncpy (tracker, file_buffer, strlen(file_buffer) - strlen(strchr(file_buffer, '\n'))); // Keep file_buffer for later
} else {
delete[] file_buffer;
delete[] tracker;
return -3;
}
if (strlen(tracker) == strlen(strstr(tracker, delimiter)))
tracker += strlen(delimiter);
int loop;
for (loop = 1; tracker = strstr(tracker, delimiter); loop++) {
if (strlen(delimiter) == strlen(tracker)) {
break;
}
// Try to add it so it minus's a delimiter when two are in a row :/
tracker += strlen(delimiter);
}
// Reset tracker, set exempt and exempt_num
delete[] tracker;
tracker = new char[strlen(file_buffer) - strlen(strchr(file_buffer, '\n')) + 1];
strncpy (tracker, file_buffer, strlen(file_buffer) - strlen(strchr(file_buffer, '\n')));
delete[] file_buffer;
exempt_num = loop;
exempt = new char*[exempt_num];
if (strlen(tracker) == strlen(strstr(tracker, delimiter)))
tracker += strlen(delimiter);
for (loop = 1; loop <= exempt_num; loop++) {
if (strstr(tracker, delimiter)) {
exempt[loop - 1] = new char[strlen(tracker) - strlen(strstr(tracker, delimiter)) + 1];
if (strncpy (exempt[loop - 1], tracker, strlen(tracker) - strlen(strstr(tracker, delimiter))) == NULL) {
delete[] tracker;
delete[] exempt;
return -4;
}
} else {
exempt[loop - 1] = new char[strlen(tracker) + 1];
if (strcpy(exempt[loop - 1], tracker) == NULL) {
delete[] tracker;
delete[] exempt;
return -4;
}
}
if (strstr(tracker, delimiter) != NULL) {
tracker = strstr(tracker, delimiter);
tracker += strlen(delimiter);
}
}
delete[] tracker;
return 0;
}
int config::set_dest () {
// Load the file and cut it down to the dest section
fseek(handle, 0, SEEK_END);
int filesize = ftell(handle);
rewind (handle);
char* file_buffer = new char[filesize + 1];
fread (file_buffer, filesize, 1, handle);
file_buffer = strchr(file_buffer, '\n') + 1;
file_buffer = strchr(file_buffer, '\n') + 1;
delete[] file_buffer;
int loop;
char* tracker = new char[strlen(file_buffer) + 1500];
if (strcpy(tracker, file_buffer) == NULL) {
delete[] tracker;
delete[] file_buffer;
return -1;
}
for (loop = 1; tracker = strchr(tracker, '\n'); loop++) {
tracker++;
if (strchr(tracker, '\n') == NULL) {
if (strlen(tracker) > 0)
loop++;
break;
}
if (strlen(tracker) == strlen(strchr(tracker, '\n')))
loop--;
}
dest_num = loop;
if (dest_num < 1) {
delete[] tracker;
delete[] file_buffer;
return -2;
}
dest = new char*[dest_num];
//delete[] tracker;
tracker = new char[strlen(file_buffer) - strlen(strchr(strchr(file_buffer, '\n') + 1, '\n')) + 1];
if (strncpy(tracker, strchr(file_buffer, '\n') + 1, strlen(file_buffer) - strlen(strchr(strchr(file_buffer, '\n') + 1, '\n'))) == NULL) {
delete[] tracker;
delete[] file_buffer;
return -1;
}
//delete[] file_buffer;
for (loop = 1; loop <= dest_num; loop++) {
if (strchr(tracker, '\n') != NULL) {
if (strlen(tracker) != strlen(strchr(tracker, '\n'))) {
dest[loop - 1] = new char[strlen(tracker) - strlen(strchr(tracker, '\n'))];
strncpy(dest[loop - 1], tracker, strlen(tracker) - strlen(strchr(tracker, '\n')));
tracker = strchr(tracker, '\n') + 1;
} else {
tracker++;
loop--;
continue;
}
} else {
printf ("%i", strlen(tracker));
}
}
return 0;
}